package com.dtx.decorator;

/**
 * FullBorder类是SideBorder类一样,也是Border类的子类。SideBorder类会在字符串的左右两侧加上装饰边框,
 * 而FullBorder类则会在字符串的上下左右都加上装饰边框。不过,在SideBorder类中可以指定边框的字符,而在FullBorder
 * 类中,边框的字符是固定的。
 * makeLine方法可以连续地显示某个指定的字符,它是一个工具方法(为了防止FullBorder类外部使用该方法,我们
 * 设置它的可见性为private)。
 */
public class FullBorder extends Border{

    protected FullBorder(Display display) {
        super(display);
    }

    /**
     * 字符数为被装饰物的字符数加上两侧边框字符数
     * @return
     */
    @Override
    public int getColumns() {
        return 1 + display.getColumns() + 1;
    }

    /**
     * 行数为被装饰物的行数加上上下边框的行数
     * @return
     */
    @Override
    public int getRows() {
        return 1 + display.getRows() + 1;
    }

    /**
     * 指定的那一行的字符串
     * @param row
     * @return
     */
    @Override
    public String getRowText(int row) {

        //下边框
        if (row == 0) {
            return "+" + makeLine('-',display.getColumns()) + "+";
        }//上边框
        else if(row == display.getRows() + 1){
            return "+" + makeLine('-',display.getColumns()) + "+";
        }//其他边框
        else {
            return "|" + display.getRowText(row - 1) + "|";
        }
    }

    /**
     * 生成一个重复count次字符ch的字符串
     * @param ch
     * @param count
     * @return
     */
    private String makeLine(char ch,int count){
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < count; i++) {
            buf.append(ch);
        }
        return buf.toString();
    }
}
